/** * Sony Vegas Pro (10) audio exchange script to export current project to simplified Adobe Audition .sesx format. * * Hacked together from the EDL export example by Jarno Elonen * 2011-12-03 **/ import System; import System.Text; import System.IO; import System.Windows.Forms; import Sony.Vegas; var writer : StreamWriter = null; var nextClipId = 0; var eventIdx = 0; var fileToClipInfoTable = Array(); var accumulatedErrors = ""; var sesxSampleRate = 48000; try { var noTime = new Timecode(); // find selected tracks var audioTrack = FindTrackNOfType(MediaType.Audio,0); if (null == audioTrack) { throw "no selected audio tracks to export"; } var projPath = Vegas.Project.FilePath; var title = Path.GetFileNameWithoutExtension(projPath); var outputFilename = Path.ChangeExtension(projPath, ".sesx"); var outputFilename = ShowSaveFileDialog("Audition session Files (*.SESX)|*.SESX", "Save SESX", title); if (null != outputFilename) { writer = new StreamWriter(outputFilename, false, System.Text.Encoding.UTF8, 512); var projLen = Vegas.Project.Length.ToMilliseconds()/1000.0*sesxSampleRate; writer.WriteLine(''); writer.WriteLine(''); writer.WriteLine(''); writer.WriteLine(' '); writer.WriteLine(' ' + title + '' ); writer.WriteLine(' ' ); // do audio tracks var n=0; var audioTrack = FindTrackNOfType(MediaType.Audio,n); while ( null != audioTrack ) { for ( var chan=0; chan<=1; chan++ ) { writer.WriteLine(' '); writer.WriteLine(' '); if ( chan==0 ) writer.WriteLine(' ' + audioTrack.Name + '.L'); else writer.WriteLine(' ' + audioTrack.Name + '.R'); writer.WriteLine(' '); writer.WriteLine(' '); writer.WriteLine(' '); writer.WriteLine(' '); writer.WriteLine(' '); ExportTrack(new Enumerator(audioTrack.Events), chan); writer.WriteLine(' '); } n++; audioTrack = FindTrackNOfType(MediaType.Audio,n); } writer.WriteLine(' '); writer.WriteLine(' '); writer.WriteLine(' Master'); writer.WriteLine(' '); writer.WriteLine(' '); writer.WriteLine(' '); writer.WriteLine(' '); writer.WriteLine(' '); writer.WriteLine(' '); writer.WriteLine(' '); writer.WriteLine(' '); writer.WriteLine(' '); writer.WriteLine(' '); writer.WriteLine(' '); writer.WriteLine(' '); writer.WriteLine(''); for (var filename in fileToClipInfoTable) { var clipinfo = fileToClipInfoTable[filename]; writer.WriteLine(''); } writer.WriteLine(''); writer.WriteLine(''); writer.Close(); } } catch (e) { if (null != writer) writer.Close(); MessageBox.Show(e); } if ( accumulatedErrors != "" ) { MessageBox.Show("Errors:\n" + accumulatedErrors); } function ExportTrack(events, chan) { var currentEvent = events.item(); try { while ( !events.atEnd()) { currentEvent = events.item(); var activeTake = currentEvent.ActiveTake; var mediaPath = activeTake.MediaPath var media = Vegas.Project.MediaPool[mediaPath]; var tapeName = GetTapeName(media); var trackType = GetTrackType(currentEvent); var sourceIn = media.TimecodeIn + activeTake.Offset; var timelineIn = currentEvent.Start; var clipLength = currentEvent.Length; var filename = Path.GetFullPath(mediaPath); var clipInfo = fileToClipInfoTable[filename]; if ( !clipInfo ) { clipInfo = Array(); clipInfo['id'] = nextClipId; nextClipId++; clipInfo['filenameonly'] = Path.GetFileName(mediaPath); fileToClipInfoTable[filename] = clipInfo; } var srcInSamples = (int)(sourceIn.ToMilliseconds() / 1000.0 * sesxSampleRate); var inSamples = (int)(timelineIn.ToMilliseconds() / 1000.0 * sesxSampleRate); var lenSamples = (int)(clipLength.ToMilliseconds() / 1000.0 * sesxSampleRate); writer.WriteLine(' '); writer.WriteLine(' '); writer.WriteLine(' '); //writer.WriteLine(' '); writer.WriteLine(' '); writer.WriteLine(' '); eventIdx++; events.moveNext(); } return; /* // compute parameters for current event var activeTake = currentEvent.ActiveTake; var mediaPath = activeTake.MediaPath var media = Vegas.Project.MediaPool[mediaPath]; var tapeName = GetTapeName(media); var trackType = GetTrackType(currentEvent); if ( trackIdx > 0 ) trackType = "NONE "; var sourceIn = media.TimecodeIn + activeTake.Offset; var timelineIn = currentEvent.Start; var clipLength = currentEvent.Length; */ /* if (null != nextEvent) { clipLength -= nextEvent.FadeIn.Length; } if (null != prevMediaPath) { var frameCount = currentEvent.FadeIn.Length.FrameCount; WriteEdit(editIndex, tapeName, trackType, "D", frameCount, sourceIn, timelineIn, clipLength); WriteClipComment("FROM", prevMediaPath); WriteClipComment("TO", mediaPath); } else { WriteEdit(editIndex, tapeName, trackType, "C", 0, sourceIn, timelineIn, clipLength); WriteClipComment("FROM", mediaPath); } if ( trackIdx > 0 ) writer.WriteLine("AUD " + (trackIdx+2) + " "); // add comments for altered playback rates, etc. (may want to add // comments for inverted phase, channel remapping, looping, etc. if (currentEvent.PlaybackRate != 1) { writer.WriteLine("* Event PlaybackRate = " + currentEvent.PlaybackRate); } if (currentEvent.IsVideo()) { if (currentEvent.Envelopes.HasEnvelope(EnvelopeType.Velocity)) { writer.WriteLine("* Event has velocity envelope."); } } */ /* if (null != nextEvent) { var frameCount = nextEvent.FadeIn.Length.FrameCount; if (frameCount > 0) { sourceIn += clipLength; timelineIn += clipLength; WriteEdit(editIndex+1, tapeName, trackType, "C", 0, sourceIn, timelineIn, noTime); return ExportTrack(events, editIndex+1, mediaPath, trackIdx); } } */ } catch(e) { if ( currentEvent ) accumulatedErrors += "Warning: ignored error ar time " + currentEvent.Start + ": " + e + "\n"; else accumulatedErrors += "Error: " + e + "\n"; } //return ExportTrack(events, editIndex+1, null, trackIdx); } // assumes all audio is stereo function GetTrackType(evnt) { // "V/AAAA" if (evnt.IsVideo()) return "V "; return "AA "; } function GetTapeName(media) { var tapeName = media.TapeName; if ((null == tapeName) || (0 == tapeName.length)) { tapeName = "UNKNOWN"; } // strip spaces (really should be any non-alphanumeric characters) if (null != tapeName.match(/ /)) { tapeName = tapeName.replace(/ /g, ""); } if (tapeName.length > 8) { // tape name is too long... chop off the end tapeName = tapeName.substring(0, 8); } return tapeName; } function WriteEdit(editIndex, tapeName, trackType, editType, frameCount, sourceIn, timelineIn, clipLength) { var edit : StringBuilder = new StringBuilder(); edit.Append("\n"); edit.Append(String.Format("{0:D3}", editIndex)); edit.Append(" "); edit.Append(tapeName); edit.Append(" "); edit.Append(trackType); edit.Append(" "); edit.Append(editType); edit.Append(" "); if (frameCount > 0) { edit.Append(String.Format("{0:D3}", frameCount)); //edit.Append(frameCount); edit.Append(" "); } else { edit.Append(" "); } edit.Append(sourceIn.ToString()); edit.Append(" "); var sourceOut = sourceIn + clipLength; edit.Append(sourceOut.ToString()); edit.Append(" "); edit.Append(timelineIn.ToString()); edit.Append(" "); var timelineOut = timelineIn + clipLength; edit.Append(timelineOut.ToString()); writer.WriteLine(edit.ToString()); } function WriteClipComment(prefix, mediaPath) { var c = new StringBuilder("* "); c.Append(prefix); c.Append(" CLIP NAME: "); c.Append(Path.GetFileName(mediaPath)); writer.WriteLine(c.ToString()); } function GetFCM() : String { var rulerFormat = Vegas.Project.Ruler.Format; switch (rulerFormat) { case RulerFormat.SmpteDrop: return "DROP FRAME"; case RulerFormat.SmpteFilmSync: case RulerFormat.SmpteFilmSyncIVTC: return "NON-DROP 24 FRAME"; default: return "NON-DROP FRAME"; } } function FindTrackNOfType(mediaType, n) : Track { var trackEnum = new Enumerator(Vegas.Project.Tracks); while (!trackEnum.atEnd()) { var track : Track = Track(trackEnum.item()); if (track.MediaType == mediaType) { if ( n==0 ) return track; else n--; } trackEnum.moveNext(); } return null; } // an example filter: "PNG File (*.png)|*.png|JPEG File (*.jpg)|*.jpg" function ShowSaveFileDialog(filter, title, defaultFilename) { var saveFileDialog = new SaveFileDialog(); if (null == filter) { filter = "All Files (*.*)|*.*"; } saveFileDialog.Filter = filter; if (null != title) saveFileDialog.Title = title; saveFileDialog.CheckPathExists = true; saveFileDialog.AddExtension = true; if (null != defaultFilename) { var initialDir = Path.GetDirectoryName(defaultFilename); if (Directory.Exists(initialDir)) { saveFileDialog.InitialDirectory = initialDir; } saveFileDialog.DefaultExt = Path.GetExtension(defaultFilename); saveFileDialog.FileName = Path.GetFileName(defaultFilename); } if (System.Windows.Forms.DialogResult.OK == saveFileDialog.ShowDialog()) { return Path.GetFullPath(saveFileDialog.FileName); } else { return null; } }